有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Lotus Notes邮件文档获取附件名称(和导出附件)

我的一个lotus notes邮件文档中有三个附件

沙漠。九头蛇怪。jpg和郁金香。jpg

我有下面的代码段

        Vector<Item> itemList = lotusNotesDocument.getItems();

        for (Item item : itemList)
        {
            if (item.getType() == Item.ATTACHMENT)
            {
                System.out.println("*****111********* ATTACHMENT=" + item.getName() + "=" + item.getValueString());
            }
            else if (item.getType() == Item.EMBEDDEDOBJECT)
            {
                System.out.println("*****222********* EMBEDDEDOBJECT=" + item.getName() + "=" + item.getValueString());
            }
            else if (item.getType() == Item.MIME_PART)
            {
                System.out.println("*****333********* MIME_PART=" + item.getName() + "=" + item.getValueString());
            }               
        }

这段代码的输出如下

*****333********* MIME_PART=Body=
*****333********* MIME_PART=Body=
*****111********* ATTACHMENT=$FILE=Hydrangeas.jpg
*****111********* ATTACHMENT=$FILE=Hydrangeas.jpg
*****111********* ATTACHMENT=$FILE=Hydrangeas.jpg
*****333********* MIME_PART=Body=
*****333********* MIME_PART=Body=

这是dominoapi中的一个bug吗?以前有其他人遇到过这个吗

我的确切要求是将附件保存到磁盘

PS:我正在使用Lotus Expediter 6.2.3.20110921-0940


共 (2) 个答案

  1. # 1 楼答案

    这确实是一种bug,但它太古老了,以至于“这只是音符的行为”。如果您有多个名称相同的项目,则始终会得到第一个项目

    但是,通常NotesDocument中的附件嵌入到富文本项中,因此可以循环rt项并获取附件。如果是这种情况,此代码应执行以下操作:

        ForAll i In doc.Items
          If i.Type = RICHTEXT Then
            Print "rt item:", i.Name
            If Not IsEmpty(i.EmbeddedObjects) Then
                If ( i.Type = RICHTEXT ) Then
                    ForAll o In i.EmbeddedObjects
                        If ( o.Type = EMBED_ATTACHMENT ) Then
                            If dir(sPath & o.Name)<>"" Then Kill sPath & o.Name
                            Print sPath & o.Name
                            Call o.ExtractFile(sPath & o.Name)  
                        End If
                    End ForAll
                End If
            End If
          End If
        End ForAll
    

    对于不是富文本项(直接附加到文档)的情况,我认为代码应该类似:

        If Not IsEmpty(doc.Embeddedobjects) Then
            ForAll o1 In doc.Embeddedobjects
                If ( o1.Type = EMBED_ATTACHMENT ) Then
                    'Set o = obj2
                    If Dir(sPath & o1.Name)<>"" Then Kill sPath & o1.Name
                    Print "doc>", sPath & o1.Name
                    Call o1.ExtractFile(sPath & o1.Name)  
                End If
            End ForAll          
        End If
    

    然而,我刚刚测试了这段代码,并惊讶地发现它并没有拾取任何附件(甚至文档中的OLE对象),我想知道是否有人对此有意见-我很确定它在过去的好日子里工作正常

    在进一步调查中,一个既适用于项目又适用于直接嵌入项目的解决方案是:

    dim names, obj
    names = Evaluate("@AttachmentNames", doc)
    ForAll aname In names
        Set obj = doc.Getattachment(aname)
        Print "any>", sPath & obj.Name
        Call obj.ExtractFile(sPath & obj.Name) 
    End ForAll
    

    在所有情况下都有一个限制-如果您有几个相同的命名附件,那么您只能使用一次“正确”的名称,其他所有附件都将使用内部生成的名称。我不知道有什么更好的解决方案,比下拉到C API来获取此信息更好

  2. # 2 楼答案

    我找到了答案

    我好像有一个

    lotusNotesDocument.convertToMIME();
    

    在我前面提出的代码块之前执行的语句

    如果我去掉这个,输出如下

    **1***111********* ATTACHMENT=$FILE=Desert.jpg
    **1***111********* ATTACHMENT=$FILE=Hydrangeas.jpg
    **1***111********* ATTACHMENT=$FILE=Tulips.jpg
    

    我有很多记录。convertToMIME()将notes邮件导出到磁盘。因此,我将把这两条语句移到附件导出部分下面

    通过以下Link的另一篇帖子找到了答案